package cn.lg.soar.general.api.service;

import cn.lg.soar.general.api.model.RegionDTO;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 区域接口
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IRegionApi {

    /**
     * 根据id获取区域
     * @param id
     * @return
     */
    RegionDTO getById(int id);

    /**
     * 根据id获取区域List
     * @param ids
     * @return
     */
    List<RegionDTO> listByIds(Collection<Integer> ids);

    /**
     * 根据id获取区域List
     * @param ids
     * @return
     */
    default List<RegionDTO> listByIds(Integer...ids) {
        return listByIds(Arrays.asList(ids));
    }

    default Map<Integer, RegionDTO> mapByIds(List<Integer> ids) {
        return listByIds(ids).stream().collect(Collectors.toMap(RegionDTO::getId, x -> x));
    }

    /**
     * 根据id获取区域及其上级区域
     * @param id
     * @return
     */
    List<RegionDTO> getRegionPath(int id);

    /**
     * 获取区域名称
     * @param id
     * @return
     */
    List<String> getNameList(int id);

    /**
     * 获取名称map
     * @param ids
     * @return
     */
    Map<Integer, List<String>> getNameListMap(Collection<Integer> ids);

    /**
     * 获取名称map
     * @param delimiter
     * @param ids
     * @return
     */
    default Map<Integer, String> getNameMap(CharSequence delimiter, Collection<Integer> ids) {
        Map<Integer, List<String>> map = getNameListMap(ids);
        Map<Integer, String> nameMap = new HashMap<>(map.size());
        map.forEach((k, v) -> {
            nameMap.put(k, String.join(delimiter, v));
        });
        return nameMap;
    }

    /**
     * 获取名称map
     * @param ids
     * @return
     */
    default Map<Integer, String> getNameMap(Collection<Integer> ids) {
        return getNameMap(" ", ids);
    }

    /**
     * 获取地区名称
     * @param delimiter
     * @param id
     * @return
     */
    default String getName(CharSequence delimiter, int id) {
        List<String> names = getNameList(id);
        return String.join(delimiter, names);
    }

    /**
     * 获取地区名称
     * @param id
     * @return
     */
    default String getName(int id) {
        return getName(" ", id);
    }

}
